"""
主题：B站视频爬取
涉及音视频分离爬取
条件
我给出关键字 爬取与关键字相关的视频并 合成保存到本地 ，最后将纯音视频删除
其他要求
我可以给出对应的数值控制爬取视频的个数

word=input()

关键字相关的视频
1找到包含与关键字相关的视频主页的url
    这种需求 就直接到搜索页面进行关键字传入点击搜索  抓包
    会出现 跳转   就跟进去  在二级目录重新搜索
    出现json格式数据 数据量太大   打开response标签搜索查看
    https://www.bilibili.com/video/av98270840   数据包里面找到的
    www.bilibili.com/video/BV1zE411w7hL
    以上url都能进行访问

2.对音视频url进行定位
3分别对音视频url进行发送请求
4合成保存到本地
5最后将纯音视频删除
"""
import os

import requests
import re
word=input("请输入要爬取的关键字:")

# 1找到包含与关键字相关的视频主页的url 抓包
url=f"https://api.bilibili.com/x/web-interface/search/all/v2?__refresh__=true&_extra=&context=&page=1&page_size=42&order=&duration=&from_source=&from_spmid=333.337&platform=pc&highlight=1&single_column=0&keyword={word}&preload=true&com2co=true"
# 第二页url
# https://api.bilibili.com/x/web-interface/search/type?__refresh__=true&_extra=&context=&page=2&page_size=42&from_source=&from_spmid=333.337&platform=pc&highlight=1&single_column=0&keyword=%E5%BD%AD%E4%BA%8E%E6%99%8F&category_id=&search_type=video&dynamic_offset=36&preload=true&com2co=true
# 构建请求头
headers={
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36",
    "referer": "https://search.bilibili.com/all?vt=51987830&keyword=%E8%BF%AA%E4%B8%BD%E7%83%AD%E5%B7%B4&from_source=webtop_search&spm_id_from=333.1007",
}
# 发送请求
response1=requests.get(url=url,headers=headers)

data=response1.content.decode()
# 2.对音视频url进行定位
# 包含所有二级目录的url
urlsss=re.findall('"arcurl":"(.*?)","aid"',data)

titles=re.findall('"title":"(.*?)","description"',data)
# 返回的数据是没有办法控制的   可能返回了第二页的数据
# print(titles)
# print(urlsss)
# print(len(titles))
# print(len(urlsss))

# 对标题进行清洗
titlelist=[]
for i in zip(titles,urlsss):
    # 对字符串进行清洗 因为有些符号系统不让作为保存文件名的符号
    # 并且结合实际情况  复制需要被替换的字符
    titil=i[0].replace("【","").replace("u003cem","").replace("\\","").replace("/","").replace("】","").replace('"',"").replace("class=keyword","").replace("u003e","").replace('！',"").replace("!","").replace("u003cem","").replace(" ","")
    # print(titil)
    titlelist.append(titil)

# 2.对音视频url进行定位
num=int(input("请输入要爬取的视频个数:"))
for i in range(num):
    link=urlsss[i+1]
    title=titlelist[i+1]
    response2=requests.get(url=link,headers=headers)
    data2=response2.content.decode()
    print(data2)
    print(link)
#     纯音频提取
    audio_url=re.findall('"audio":\[\{"id":30280,"baseUrl":"(.*?)"',data2)

#     提取纯视频url 可以添加操作  如果没有对应的清晰度的视频url  爬取低一级的视频
    video_url=re.findall('"video":\[\{"id":80,"baseUrl":"(.*?)"',data2)
    if video_url==[]:
        video_url = re.findall('"video":\[\{"id":64,"baseUrl":"(.*?)"', data2)
    print(audio_url)
    print(video_url)
#     请求视频
    video_urls=video_url[0]
    print("正在爬取视频")
    # 3分别对音视频url进行发送请求
    # 4合成保存到本地
    video_response=requests.get(url=video_urls,headers=headers)
    with open(f"{title}demo.mp4","wb")as f1:
        f1.write(video_response.content)
    print(f"{title}demo.mp4保存成功! ")
#     请求音频
    audio_urls=audio_url[0]
    print("正在爬取音频")
    audio_response=requests.get(url=audio_urls,headers=headers)
    with open(f"{title}.mp3","wb")as f2:
        f2.write(audio_response.content)
    # 合成视频
    # 对纯视频进行字符添加 完成和合成视频的文件做区别
    # 注意点 在给出区别标识时也要给纯视频的文件名写入标识
    print("正在合成视频")
    os.system(fr"ffmpeg -i {title}demo.mp4 -i {title}.mp3 -c copy D:\六星教育\2203期\2022_3_python\{title}.mp4")
# 5最后将纯音视频删除
    os.remove(f'./{title}demo.mp4')
    print(f"{title}demo.mp4已删除")
#     删除音频
    os.remove(f"./{title}.mp3")
    print(f"{title}.mp3已删除")











